import java.util.Arrays;

public class MyArrayList implements ILisst{
    private int DEFAULT_SIZE = 10;
    public int[] elem;

    private int usedSize = 0;

    public MyArrayList() {
        this.elem = new int[DEFAULT_SIZE];
    }
    @Override
    public void display() {
        for(int i = 0; i < usedSize; i++) {
            System.out.print(elem[i] + " ");
        }
        System.out.println();
    }


    @Override
    public void add(int data) {
        //判断是否数组已满
        if(isFull()) {
            //扩容
            this.elem = Arrays.copyOf(elem,2 * usedSize);
        }
        //尾插
        this.elem[usedSize] = data;
        usedSize++;
    }

    @Override
    public boolean isFull() {
        return elem.length == usedSize;
    }

    @Override
    public boolean checkPosInAdd(int pos) {
        if(pos < 0 || pos >= elem.length) {
            return true;
        }
        return false;
    }

    @Override
    public void add(int pos, int data) {
        try{
            //判断是否数组已满
            if(isFull()) {
                //扩容
                this.elem = Arrays.copyOf(elem,2 * usedSize);
            }
            //还需判断插入位置下标是否合法
            if(checkPosInAdd(pos)) {
                //抛异常
                throw new PosIllegalException("pos不合法");
            }
            for (int i = usedSize - 1; i >= pos; i--) {
                elem[i + 1] = elem[i];
            }
            elem[pos] = data;
            usedSize++;
        }catch (PosIllegalException e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean contains(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }

    @Override
    public int indexOf(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if(elem[i] == toFind) {
                return i;
            }
        }
        return -1;
    }

    @Override
    public int get(int pos) {
        try {
            //pos是否合法
            if(checkPosInAdd(pos)) {
                //不合法
                throw new PosIllegalException("pos不合法");
            }
            return elem[pos];
        }catch (PosIllegalException e) {
            e.printStackTrace();
        }
        return -1;
    }

    @Override
    public boolean isEmpty() {
        return usedSize == 0;
    }

    @Override
    public void set(int pos, int value) {
        try {
            //pos是否合法
            if(checkPosInAdd(pos)) {
                //不合法
                throw new PosIllegalException("pos不合法");
            }
            this.elem[pos] = value;
        }catch (PosIllegalException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void remove(int key) {
        try {
            //查找你要删除的元素有没有
            int flag = 0; //没找到
            int i = 0;
            for (i = 0; i < usedSize; i++) {
                if(elem[i] == key) {
                    flag = 1; //找到了
                    break;
                }
            }
            if(flag == 0) {
                //抛异常
                throw new NoValueException("没有你删除的元素");
            }
            //开始删除
            for(int j = i; j < usedSize - 1; j++) {
                elem[j] = elem[j + 1];
            }
            usedSize--;
        }catch (NoValueException e) {
            e.printStackTrace();
        }

    }

    @Override
    public int size() {
        return usedSize;
    }

    @Override
    public void clear() {
        //最好将每一个元素置空，在这里是整型无所谓，如果是引用类型就可能导致内存泄露。
        for(int i = 0; i < usedSize; i++) {
            elem[i] = 0;
        }
        usedSize = 0;
    }
}
